<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js light">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>更新到 0.5 - The Rust Rand Book</title>
        
        


        <!-- Custom HTML head -->
        


        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <meta name="description" content="Extended documentation for Rust&#x27;s Rand lib">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        
        <link rel="icon" href="favicon.svg">
        
        
        <link rel="shortcut icon" href="favicon.png">
        
        <link rel="stylesheet" href="css/variables.css">
        <link rel="stylesheet" href="css/general.css">
        <link rel="stylesheet" href="css/chrome.css">
        <link rel="stylesheet" href="css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
        
        <link rel="stylesheet" href="fonts/fonts.css">
        

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="highlight.css">
        <link rel="stylesheet" href="tomorrow-night.css">
        <link rel="stylesheet" href="ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        

        
    </head>
    <body>
        <!-- Provide site root to javascript -->
        <script type="text/javascript">
            var path_to_root = "";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script type="text/javascript">
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script type="text/javascript">
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('light')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script type="text/javascript">
            var html = document.querySelector('html');
            var sidebar = 'hidden';
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item expanded affix "><a href="intro.html">介绍</a></li><li class="chapter-item expanded "><a href="guide-start.html"><strong aria-hidden="true">1.</strong> 入门指南</a></li><li class="chapter-item expanded "><a href="crates.html"><strong aria-hidden="true">2.</strong> crate 和特性</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="crates-rand.html"><strong aria-hidden="true">2.1.</strong> 随机加密(co)</a></li><li class="chapter-item expanded "><a href="crates-gen.html"><strong aria-hidden="true">2.2.</strong> 随机信号生成器</a></li></ol></li><li class="chapter-item expanded "><a href="guide.html"><strong aria-hidden="true">3.</strong> 指南</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="guide-data.html"><strong aria-hidden="true">3.1.</strong> 随机数据</a></li><li class="chapter-item expanded "><a href="guide-gen.html"><strong aria-hidden="true">3.2.</strong> 生成器类型</a></li><li class="chapter-item expanded "><a href="guide-rngs.html"><strong aria-hidden="true">3.3.</strong> 随机数生成器(RNGs)</a></li><li class="chapter-item expanded "><a href="guide-seeding.html"><strong aria-hidden="true">3.4.</strong> 为随机数生成器置种</a></li><li class="chapter-item expanded "><a href="guide-values.html"><strong aria-hidden="true">3.5.</strong> 随机值</a></li><li class="chapter-item expanded "><a href="guide-dist.html"><strong aria-hidden="true">3.6.</strong> 各种分布方式</a></li><li class="chapter-item expanded "><a href="guide-seq.html"><strong aria-hidden="true">3.7.</strong> 序列</a></li><li class="chapter-item expanded "><a href="guide-err.html"><strong aria-hidden="true">3.8.</strong> 错误处理</a></li></ol></li><li class="chapter-item expanded "><a href="portability.html"><strong aria-hidden="true">4.</strong> 可移植性</a></li><li class="chapter-item expanded "><a href="update.html"><strong aria-hidden="true">5.</strong> 更新</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="update-0.5.html" class="active"><strong aria-hidden="true">5.1.</strong> 更新到 0.5</a></li><li class="chapter-item expanded "><a href="update-0.6.html"><strong aria-hidden="true">5.2.</strong> 更新到 0.6</a></li><li class="chapter-item expanded "><a href="update-0.7.html"><strong aria-hidden="true">5.3.</strong> 更新到 0.7</a></li></ol></li><li class="chapter-item expanded "><a href="contributing.html"><strong aria-hidden="true">6.</strong> 贡献</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="contrib-doc.html"><strong aria-hidden="true">6.1.</strong> 文档</a></li><li class="chapter-item expanded "><a href="contrib-scope.html"><strong aria-hidden="true">6.2.</strong> Scope</a></li><li class="chapter-item expanded "><a href="contrib-test.html"><strong aria-hidden="true">6.3.</strong> 测试</a></li><li class="chapter-item expanded "><a href="contrib-bench.html"><strong aria-hidden="true">6.4.</strong> 基准</a></li></ol></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                
                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky bordered">
                    <div class="left-buttons">
                        <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </button>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                        
                    </div>

                    <h1 class="menu-title">The Rust Rand Book</h1>

                    <div class="right-buttons">
                        <a href="print.html" title="Print this book" aria-label="Print this book">
                            <i id="print-button" class="fa fa-print"></i>
                        </a>
                        
                    </div>
                </div>

                
                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>
                

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script type="text/javascript">
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <blockquote>
<p><a href="https://github.com/rust-random/book/blob/master/src/update-0.5.md">update-0.5.md</a><br />
commit: c8fce4fed283853aa4ff237ba969763c059a81d1 <br />
本章译文最后维护日期：2020-12-1</p>
</blockquote>
<h1><a class="header" href="#updating-to-05" id="updating-to-05">Updating to 0.5</a></h1>
<h1><a class="header" href="#升级至05版" id="升级至05版">升级至0.5版</a></h1>
<p>与0.4版本相比，0.5版本有相当大的变化；因此，阅读下面关于破坏性/突破性变更的报道是值得的。这个版本还包含了许多优化，限于篇幅问题，下面并没有详细说明。</p>
<h2><a class="header" href="#crates" id="crates">Crates</a></h2>
<p>我们有了一个新的 crate：<code>rand_core</code>！这个 crate 包含了一些重要的 trait，即 <code>RngCore</code>、<code>BlockRngCore</code>、<code>SeedableRng</code> 和 <code>CryptoRng</code>，错误(<code>Error</code>)类型，以及两个实现辅助(helper)模块：<code>le</code> 和 <code>impls</code>。建议生成器的实现使用 <code>rand_core</code> crate，而其他用户仅使用 <code>rand</code> crate就可以了，该 crate 重新导出了 <code>rand_core</code> 的大部分内容。</p>
<p><code>rand_derive</code> crate 由于 <code>Rand</code> 的使用率很低而被弃用。</p>
<h2><a class="header" href="#features" id="features">Features</a></h2>
<h2><a class="header" href="#特性" id="特性">特性</a></h2>
<p>此版本增加了几个新的 Cargo特性标志位：</p>
<ul>
<li><code>alloc</code>，在不需要显式开启 <code>std</code>特性标志位的情况下，允许使用 <code>Box</code> 和 <code>Vec</code></li>
<li><code>serde1</code> 被加入进来，用于支持对一些PRNG的序列化</li>
<li><code>log</code> 用于在几个地方（主要是 <code>OsRng</code> 和 <code>JitterRng</code>）记录日志</li>
</ul>
<h2><a class="header" href="#rng-and-friends-core-traits" id="rng-and-friends-core-traits"><code>Rng</code> and friends (core traits)</a></h2>
<p><code>Rng</code> trait 被分成了两个 trait，一个是“后端”的 <code>RngCore</code>（由生成器实现），另一个是“前端”的 <code>Rng</code>，它实现了所有的便捷的扩展方法。</p>
<p>生成器的实现必须改为 <code>impl RngCore</code>。鼓励使用 <code>rand_core</code> 来实现各种生成器；<code>rand_core::{le, impls}</code>这两辅助模块可能被证明是很有用的。</p>
<p><em>不需要实现</em> <code>Rng</code> 的用户不需要做太多更改；通常用户可以忘记 <code>RngCore</code>，只导入 <code>Rng</code> 就够了。用户应该选择使用 <code>Rng::gen()</code>，而不是 <code>RngCore::next_u32()</code> / <code>next_u64()</code>；使用 <code>Rng::fill(dest)</code>，而不是使用 <code>RngCore::fill_bytes(dest)</code>。</p>
<h3><a class="header" href="#rng--rngcore-methods" id="rng--rngcore-methods"><code>Rng</code> / <code>RngCore</code> methods</a></h3>
<h3><a class="header" href="#rng--rngcore-方法" id="rng--rngcore-方法"><code>Rng</code> / <code>RngCore</code> 方法</a></h3>
<p>为了允许为易出错的源（例如 <code>OsRng</code>）进行错误处理，为此添加了一个新的 <code>RngCore::try_fill_bytes</code>方法；例如，<code>EntropyRng</code> 使用此机制在<code>OsRng</code> 失败时返回到 <code>JitterRng</code>，并且为各种错误处理程序生成更好的错误消息。
与以前一样，其他方法在失败时依旧会触发 panic，但由于这些方法通常与算法生成器一起使用，而算法生成器通常是绝对正确的，因此这被认为是一种适当的折衷方案。</p>
<p>老版本的 <code>Rng</code> 中的一些方法已被删除或弃用，包括：</p>
<ul>
<li><code>next_f32</code> 和 <code>next_f64</code>；这些已不再由生成器实现；现在使用 <code>gen</code> 来替代</li>
<li><code>gen_iter</code>；用户可以使用带有闭包的标准迭代器：<code>::std::iter::repeat(()).map(|()| rng.gen())</code></li>
<li><code>gen_ascii_chars</code>; 像上面这行一样使用 <code>repeat</code>函数和使用 <code>rng.sample(Alphanumeric)</code> 来替代</li>
<li><code>gen_weighted_bool(n)</code>; 使用 <code>gen_bool(1.0 / n)</code> 来替代</li>
</ul>
<p><code>Rng</code> 中增加了几个新方法：</p>
<ul>
<li><code>sample(distr)</code>，此方法是各种 <code>Distribution</code> 的 <code>distr.sample(rng)</code>方法的快捷方法</li>
<li><code>gen_bool(p)</code>，此方法生成布尔值，其中有 <code>p</code> 的概率生成 true值</li>
<li><code>fill</code> 和 <code>try_fill</code>，分别对应于 <code>fill_bytes</code> 和 <code>try_fill_bytes</code>（它们唯一的区别是错误处理）；它们可以直接填充整型切片/数组，并提供比 <code>gen()</code> 更好的性能</li>
</ul>
<h3><a class="header" href="#constructing-prngs" id="constructing-prngs">Constructing PRNGs</a></h3>
<h3><a class="header" href="#构造prng" id="构造prng">构造PRNG</a></h3>
<h4><a class="header" href="#new-randomly-initialised-prngs" id="new-randomly-initialised-prngs">New randomly-initialised PRNGs</a></h4>
<h4><a class="header" href="#新建随机初始化prng" id="新建随机初始化prng">新建随机初始化PRNG</a></h4>
<p>此版本添加了一个新的 trait：<code>FromEntropy</code>。对于支持 <code>SeedableRng</code> 的任何类型，都会自动实现这个 trait，它用新鲜的强熵来构造PRNG：</p>
<pre><pre class="playground"><code class="language-rust">
<span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>use rand::{ChaChaRng, FromEntropy};

let mut rng = ChaChaRng::from_entropy();
<span class="boring">}
</span></code></pre></pre>
<h4><a class="header" href="#seeding-prngs" id="seeding-prngs">Seeding PRNGs</a></h4>
<h4><a class="header" href="#为prng置种" id="为prng置种">为PRNG置种</a></h4>
<p><code>SeedableRng</code> trait 已被修改为通过关联类型（<code>SeedableRng::Seed</code>）而不是模板参数（<code>SeedableRng&lt;Seed&gt;</code>）来包含种子类型。此外，所有PRNG现在都是从字节数组（<code>[u8；N]</code>，其中N为固定值）。这允许对PRNG的置种进行泛型处理，这在老版本中是不可能的。</p>
<p>PRNG不再通过 <code>Rand</code> 的支持/<code>gen()</code> 来从其他PRNG构建，而是通过 <code>SeedableRng::from_rng</code>，它允许错误处理，并且是有意显式的。</p>
<p><code>SeedableRng::reseed</code> 已被删除，因为它没有 <code>from_seed</code>实用，性能优势也值得怀疑。</p>
<p><code>SeedableRng</code> 的实现可能需要将它们的 <code>Seed</code>类型更改为字节数组；此限制是为了确保在字节序(endianness)不同的平台上的可移植性。<code>rand_core::le</code> 为这种更改提供的辅助函数可以从这类字节数组读取 <code>u32</code> 和 <code>u64</code>值。</p>
<h3><a class="header" href="#block-based-prngs" id="block-based-prngs">Block-based PRNGs</a></h3>
<h3><a class="header" href="#基于块的prng" id="基于块的prng">基于块的PRNG</a></h3>
<p>rand_core 有一个新的辅助trait，<code>BlockRngCore</code>，和其实现<code>BlockRng</code>。这些是由生成器来使用的，生成器每次生成一个随机数据块，而不是字大小(word-sized,译者注：和usize一样宽)的值。使用这个 trait 和实现有两个优点：提供了优化的 <code>RngCore</code> 方法，并且PRNG可以与 <code>ReseedingRng</code> 一起使用，开销非常低。</p>
<h3><a class="header" href="#cryptographic-rngs" id="cryptographic-rngs">Cryptographic RNGs</a></h3>
<h3><a class="header" href="#加密型rng" id="加密型rng">加密型RNG</a></h3>
<p>增加了一个新trait：<code>CryptoRng</code>。这是一个纯标记trait，用来表明哪些生成器是加密型的，例如 <code>fn foo&lt;R: Rng + CryptoRng&gt;(rng: &amp;mut R)</code>。<em>注意，此trait无法保证加密使用的适用性。</em></p>
<h2><a class="header" href="#error-handling" id="error-handling">Error handling</a></h2>
<h2><a class="header" href="#错误处理" id="错误处理">错误处理</a></h2>
<p>添加了一个新的 <code>Error</code>类型，它明确设计为兼容 no-std模式，足够简单，并且有足够的适应性供我们使用（尽可能携带<code>cause</code>属性）：</p>
<pre><pre class="playground"><code class="language-rust">
<span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub struct Error {
    pub kind: ErrorKind,
    pub msg: &amp;'static str,
    // 一些忽略的字段
}
<span class="boring">}
</span></code></pre></pre>
<p>关联的 <code>ErrorKind</code> 允许将错误分为永久的、意外的、暂时的和尚未准备好的这几种。</p>
<p>下述函数使用这个新的错误类型：</p>
<ul>
<li><code>RngCore::try_fill_bytes</code></li>
<li><code>Rng::try_fill</code></li>
<li><code>OsRng::new</code></li>
<li><code>JitterRng::new</code></li>
</ul>
<h2><a class="header" href="#external-generators" id="external-generators">External generators</a></h2>
<h2><a class="header" href="#外部生成器" id="外部生成器">外部生成器</a></h2>
<p>此版本增加了一个新的生成器 <code>EntropyRng</code>，它包装了 <code>OsRng</code> 和 <code>JitterRng</code>（它倾向于使用前者，但在必要时可以使用后者）。这样就可以通过 <code>SeedableRng::from_rng</code> 轻松构造带应急(fallback)功能的生成器，例如 <code>IsaacRng::from_rng(EntropyRng::new())?</code>。 除了错误处理外，这相当于使用 <code>FromEntropy</code>。</p>
<p>推荐使用 <code>EntropyRng</code>，而不是 <code>OsRng</code>，以避免在系统生成器损坏的平台上出现错误，但应该注意的是 <code>JitterRng</code> 的应急切换非常缓慢。</p>
<h2><a class="header" href="#prngs" id="prngs">PRNGs</a></h2>
<h2><a class="header" href="#伪随机数生成器" id="伪随机数生成器">伪随机数生成器</a></h2>
<p><em>伪随机数生成器</em>（即确定性算法生成器）自0.4版以来发生了一些变化，现在它们被封装在 <code>prng</code>模块中（为了兼容，旧名称暂时可用；但最终这些生成器可能会被放置在 <code>rand</code> crate）。</p>
<p>所有PRNG现在均不实现 <code>Copy</code> 以防止意外复制生成器的状态（从而重复生成值）。通过 <code>Clone</code> 来显式克隆仍然可用。所有PRNG现在都有一个 <code>Debug</code> 的自定义实现，但它不打印任何内部状态；这有助于避免在日志文件中意外泄漏加密生成器状态。建议外部PRNG实现遵循此模式（另请参见 <code>RngCore</code> 的相关文档）。</p>
<p><code>SmallRng</code> 已经被添加为包装器，目前是围绕 <code>XorShiftRng</code>（但可能很快被另一种算法取代）。这适用于小状态，快速初始化很重要，但不需要加密强度的情况。（生成的实际性能因基准(benchmark)不同而有所不同；根据使用情况，这可能是或可能不是最快的算法，但速度很快是肯定的。）</p>
<h3><a class="header" href="#reseedingrng" id="reseedingrng"><code>ReseedingRng</code></a></h3>
<p>为了减少开销，<code>ReseedingRng</code>包装器已被显著更改。不幸的是，新的 <code>ReseedingRng</code> 并不与所有RNG兼容，只兼容那些使用 <code>BlockRngCore</code> 的RNG。</p>
<h3><a class="header" href="#chacha" id="chacha">ChaCha</a></h3>
<p><code>ChaChaRng::set_counter</code>方法已被两个新方法 <code>set_word_pos</code> 和 <code>set_stream</code> 替换。如有必要，旧方法的表现可模拟如下：</p>
<pre><pre class="playground"><code class="language-rust">
<span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span><span class="boring">use rand::prelude::*;
</span><span class="boring">use rand_chacha::ChaChaRng;
</span>let lower = 88293;
let higher = 9300932;

// 之前:
// let mut rng = rand::ChaChaRng::new_unseeded();
// rng.set_counter(lower, higher);

// 现在:
let mut rng = ChaChaRng::from_seed([0u8; 32]);
rng.set_word_pos(lower &lt;&lt; 4);
rng.set_stream(higher);

assert_eq!(4060232610, rng.next_u32());
assert_eq!(2786236710, rng.next_u32());
<span class="boring">}
</span></code></pre></pre>
<h3><a class="header" href="#isaac-prngs" id="isaac-prngs">ISAAC PRNGs</a></h3>
<p><code>IsaacRng</code> 和 <code>Isaac64Rng</code> PRNG现在有了一个附加的构造方法：<code>new_from_u64(seed)</code>。64位的状态对于加密来说是不够的，但可以在模拟和游戏中使用。这在将来很可能会被任何从哈希对象构造的PRNG的方法所取代。</p>
<h3><a class="header" href="#hc-128" id="hc-128">HC-128</a></h3>
<p>这是一个新的加密型生成器，被评选为“适合广泛采用的流密码”之一。现在这是默认的加密生成器，<code>StdRng</code> 和 <code>thread_rng()</code> 都可使用它。</p>
<h2><a class="header" href="#helper-functionstraits" id="helper-functionstraits">Helper functions/traits</a></h2>
<h2><a class="header" href="#辅助函数trait" id="辅助函数trait">辅助函数/trait</a></h2>
<p><code>Rand</code> trait 已被弃用。相反，鼓励用户使用 <code>Standard</code>，这是一个真实的分布，支持与 <code>Rand</code> 相同的抽样。<code>Rng::gen()</code> 现在使用 <code>Standard</code>，效果应该和以前一样。具体请参阅 <code>distributions</code>模块的文档，了解如何使用用户类型<code>T</code> 来为 <code>Standard</code> 实现 <code>Distribution&lt;T&gt;</code>。</p>
<p><code>weak_rng()</code> 已被弃用；请改用 <code>SmallRng::from_entropy()</code>。</p>
<h2><a class="header" href="#distributions" id="distributions">Distributions</a></h2>
<h2><a class="header" href="#分布" id="分布">分布</a></h2>
<p><code>Sample</code> trait 和 <code>IndependentSample</code> trait 已被单个 trait <code>Distribution</code> 所取代。<code>Distribution</code> 在很大程度上相当于 <code>IndependentSample</code>，但是它的 <code>ind_sample</code> 只被替换为了 <code>sample</code>。对可变分布的支持已经被放弃；尽管可变分布看起来可能会有一些真正的用途，但这些用途还没有被广泛地用于可以证明两个独立的 trait 的存在必要性，或来证明有必要提供对分布对象的可变访问。<code>Sample</code> 和 <code>IndependentSample</code> 仍可用，但已被建议弃用；它们将在将来的版本中删除。</p>
<p><code>Distribution::sample</code>（以及其他几个函数）现在可以直接在非固定尺寸类型的RNG上调用。</p>
<p><code>RandSample</code> 已被移除（请参阅 <code>Rand</code>弃用和新的 <code>Standard</code>分布）。</p>
<p><code>Closed01</code>包装器已删除，但新增了 <code>OpenClosed01</code>。</p>
<h3><a class="header" href="#uniform-distributions" id="uniform-distributions">Uniform distributions</a></h3>
<h3><a class="header" href="#均匀分布" id="均匀分布">均匀分布</a></h3>
<p>有两个新的分布可用：</p>
<ul>
<li><code>Standard</code> 为许多不同的类型生成均匀分布的样本，并被作为 <code>Rand</code>的替代品</li>
<li><code>Alphanumeric</code> 从区间 <code>a-z A-Z 0-9</code> 抽样字符(<code>char</code>s)</li>
</ul>
<h4><a class="header" href="#ranges" id="ranges">Ranges</a></h4>
<h4><a class="header" href="#区间" id="区间">区间</a></h4>
<p><code>Range</code>分布已被大量修改，并更名为 <code>Uniform</code>：</p>
<ul>
<li><code>Uniform::new(low, high)</code> 保留（等效与半开区间 <code>[low, high)</code>）</li>
<li><code>Uniform::new_inclusive(low, high)</code> 加入进来, 在抽样区间中包括 <code>high</code></li>
<li><code>Uniform::sample_single(low, high, rng)</code> 是一个效率更高的变体，相比于从 <code>[low, high)</code> 进行单次抽样来说</li>
</ul>
<p><code>Uniform</code> 现在可以被用户自定义的类型所实现；具体请参见 <code>uniform</code>模块。</p>
<h3><a class="header" href="#non-uniform-distributions" id="non-uniform-distributions">Non-uniform distributions</a></h3>
<h3><a class="header" href="#非均匀分布" id="非均匀分布">非均匀分布</a></h3>
<p>两个分布被加入进来：</p>
<ul>
<li>泊松(Poisson)分布，在固定的时间间隔内（例如核衰变），对恒定速率源的预期事件数进行建模</li>
<li>二项式(Binomial)分布，模拟固定数量的是非试验的结果</li>
</ul>
<p>抽样方法基于“Numerical Recipes in C”中的方法。</p>
<h4><a class="header" href="#exponential-and-normal-distributions" id="exponential-and-normal-distributions">Exponential and Normal distributions</a></h4>
<h4><a class="header" href="#指数分布和正态分布" id="指数分布和正态分布">指数分布和正态分布</a></h4>
<p>主 <code>Exp</code>分布和 <code>Normal</code>分布没有变化，但是“standard”版本 <code>Exp1</code> 和 <code>StandardNormal</code> 不再是包装器类型，而是完整的分布了。<code>let Exp1(x) = rng.gen();</code> 的写法被替代为 <code>let x = rng.sample(Exp1);</code> 了。</p>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                        
                            <a rel="prev" href="update.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                                <i class="fa fa-angle-left"></i>
                            </a>
                        

                        
                            <a rel="next" href="update-0.6.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                <i class="fa fa-angle-right"></i>
                            </a>
                        

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                
                    <a rel="prev" href="update.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                        <i class="fa fa-angle-left"></i>
                    </a>
                

                
                    <a rel="next" href="update-0.6.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                        <i class="fa fa-angle-right"></i>
                    </a>
                
            </nav>

        </div>

        

        

        

        
        <script type="text/javascript">
            window.playground_copyable = true;
        </script>
        

        

        
        <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="searcher.js" type="text/javascript" charset="utf-8"></script>
        

        <script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="highlight.js" type="text/javascript" charset="utf-8"></script>
        <script src="book.js" type="text/javascript" charset="utf-8"></script>

        <!-- Custom JS scripts -->
        

        

    </body>
</html>
